#ifndef __A9MAIN_H__
#define __A9MAIN_H__
#include <pthread.h>
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include <sys/msg.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<semaphore.h>
#include<errno.h>

//以上为共享内存，信号量，线程所需的头文件

#define LED 2
#define BUZZER 1
#define FENGSHAN 3
#define auto_ctl 20
#define ON 2
#define OFF 1

// 最大最小值状态结构体
typedef struct { 
	int tem_max;
	int tem_min;
	int light_max;
	int light_min;
	int hum_max;
	int hum_min;
}status;


//用于判断货物状态的宏定义
#define GOODS_NULL 0 //表示没有任何货物操作信息
#define GOODS_ADD  1//有货物出库
#define GOODS_SUB  2//向A9发送过来的仓库信息结构体
//M0通过ZIGBEE向A9发送过来的仓库信息结构体
 typedef struct {
	int temp[2];	 //温度
	int hum[2];		 //湿度
	int x;			 //三轴信息
	int y;			 
	int z;			 
	int light;		 //光照
	int goods_flags ;  //货物增减标志
	char goods_info[5];
}sendEnv;


//CGI进程向A9主进程传送的网页端控制命令结构体
typedef struct {
	long mytype;
	int type;//CGI发送的命令类型，包括三种：设置最大值最小值，M0控制命令，GPRS短信号码修改命令
	char text[100];//消息正文，具体接收后强转为对应结构体使用
}CGI_cmd;


//以下是CGI发送的命令的三种类型及相应结构体定义

#define M0_ctl 5
#define set_ctl 6
#define GPRS_chg 7


//1.第一种控制M0的命令结构体，也是A9向M0发送的控制命令的结构体
typedef struct{
	char dev;
	char command;
}M0_cmd;


//3.第三种GPRS短信号码修改命令
typedef struct
{
	char to_number[13];//修改短信将要发送到的号码
	char center_number[13];//修改中心号码
}GPRS_cmd;


//以下为与命令队列相关的定义
//定义数据类型
typedef M0_cmd datatype_t;

//定义结构体
typedef struct node{
	datatype_t data;
	struct node *next;
}linknode_t;

typedef struct{
	linknode_t *front;
	linknode_t *rear;
}linkqueue_t;

linkqueue_t *linkqueue_create();
int linkqueue_empty(linkqueue_t *lq);
int linkqueue_push(linkqueue_t *lq, datatype_t value);
M0_cmd linkqueue_pop(linkqueue_t *lq);


#define RUN     10  
#define STOP    11  


//以下为与ZIGBEE通信相关的定义
#include<termios.h> //termios 用于通用的初始化非同步通讯 ，比如 uart 设置以及初始化
#include<string.h>
#include<stdio.h>
#define DEV_ZIGBEE 			"/dev/ttyUSB1"


//用于判断货物状态的宏定义
#define GOODS_NULL 0 //表示没有任何货物操作信息
#define GOODS_ADD  1//有货物出库
#define GOODS_SUB  2//有货物入库
#endif
